﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using l1cs.server.model;

namespace l1cs.server.serverpackets
{
    public class S_RangeSkill : ServerBasePacket
    {
        private static Logger _log = Logger.getLogger( typeof( S_RangeSkill ).FullName );

        private static AtomicInteger _sequentialNumber = new AtomicInteger( 0 );

        private byte[] _byte = null;

        public const int TYPE_NODIR = 0;

        public const int TYPE_DIR = 8;

        public S_RangeSkill( L1Character cha, L1Character[] target, int spellgfx, int actionId, int type )
        {
            buildPacket( cha, target, spellgfx, actionId, type );
        }

        private void buildPacket( L1Character cha, L1Character[] target, int spellgfx, int actionId, int type )
        {
            writeC( Opcodes.S_OPCODE_RANGESKILLS );
            writeC( actionId );
            writeD( cha.getId() );
            writeH( cha.getX() );
            writeH( cha.getY() );
            if ( type == TYPE_NODIR )
            {
                writeC( cha.getHeading() );
            }
            else if ( type == TYPE_DIR )
            {
                int newHeading = calcheading( cha.getX(), cha.getY(), target[0].getX(), target[0].getY() );
                cha.setHeading( newHeading );
                writeC( cha.getHeading() );
            }
            writeD( _sequentialNumber.incrementAndGet() ); // 番号がダブらないように送る。
            writeH( spellgfx );
            writeC( type ); // 0:範囲 6:遠距離 8:範囲&遠距離
            writeH( 0 );
            writeH( target.Length );
            for ( int i = 0; i < target.Length; i++ )
            {
                writeD( target[i].getId() );
                writeC( 0x20 ); // 0:ダメージモーションあり 0以外:なし
            }
        }

        override
        public byte[] getContent()
        {
            if ( _byte == null )
            {
                _byte = _bao.ToArray();
            }
            return _byte;
        }

        private static int calcheading( int myx, int myy, int tx, int ty )
        {
            int newheading = 0;
            if ( tx > myx && ty > myy )
            {
                newheading = 3;
            }
            if ( tx < myx && ty < myy )
            {
                newheading = 7;
            }
            if ( tx > myx && ty == myy )
            {
                newheading = 2;
            }
            if ( tx < myx && ty == myy )
            {
                newheading = 6;
            }
            if ( tx == myx && ty < myy )
            {
                newheading = 0;
            }
            if ( tx == myx && ty > myy )
            {
                newheading = 4;
            }
            if ( tx < myx && ty > myy )
            {
                newheading = 5;
            }
            if ( tx > myx && ty < myy )
            {
                newheading = 1;
            }
            return newheading;
        }

        override
        public String getType()
        {
            return "[S] S_RangeSkill";
        }
    }
}
